ANSYS Classic 本身不提供外部应用程序接口,但其自身支持tcl/tk脚本,因此可以在c#与tcl之间通过Socket传递命令,然后再由tcl向ANSYS发送命令,其流程如下:
使用以下代码监听9900端口,其回调函数为EchoAccept,一旦有可读数据,调用Echo函数,若识别"/input"命令,则使用ANSYS提供给tcl的“ans_sendcommand”函数,向ANSYS发送命令,并返回命令执行结果。
581
2proc Echo_Server {port} {
3 global echo
4 puts "****************port:$port**********"
5 set echo(main) [socket -server EchoAccept $port]
6}
7
8proc EchoAccept {sock addr port} {
9 global echo
10 puts "Accept $sock from $addr port $port"
11 set echo(addr,$sock) [list $addr $port]
12 fconfigure $sock -buffering line
13 fileevent $sock readable [list Echo $sock]
14}
15
16proc Echo {sock} {
17 global echo
18 set len [gets $sock line]
19 #puts "length of line is : $len"
20 if {[eof $sock] || $len==0} {
21 close $sock
22 puts "Close $echo(addr,$sock)"
23 unset echo(addr,$sock)
24 } else {
25 if {[string compare $line "quit"] == 0} {
26 close $echo(main)
27 return
28 }
29 puts "command: $line"
30 if {[string length $line] > 0} {
31 # if it's a input command
32 if {[string first "input," $line] >0} {
33 set cmd [catch {ans_sendcommand )$line} cmsg]
34 puts "cmd = $cmd"
35 if {$cmd ==1 } {
36 if {[string first "error" $cmsg] > 0} {
37 puts "exception: $cmsg"
38 puts $sock "error"
39 } elseif {[string first "warning" $cmsg] > 0 } {
40 puts "exception: $cmsg"
41 puts $sock "warning"
42 } else {
43 puts "exception: $cmsg"
44 puts $sock "other message"
45 }
46 } else {
47 puts "success:$cmsg"
48 puts $sock "success"
49 }
50 }
51 }
52 }
53}
54
55if {[catch {Echo_Server 9900}]} {
56 if {[catch {Echo_Server 9990}]} {
57 Echo_Server 9999
58 }
在ANSYS里运行上述tcl脚本。若上述脚本保存为server.tcl文件,则运行的方式为在ANSYS命令栏输入:~tcl,source server.tcl
,启动后,在ANSYS输出窗口可以看到:
表明已经开启socket监听服务,后续可以将该过程的开启设置为自动化的,即随ANSYS启动自动运行该脚本,而无需手动输入。
由于是同一台计算机上不同程序,C#上tcp客户端请求连接127.0.0.1:9900,发送事先准备好的APDL命令流文件名,然后等待接收返回结果。
441static string sendCommand(string commandFileName)
2{
3 string resultFlag = string.Empty;
4 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9900);
5 TcpClient newClient = new TcpClient();
6 try
7 {
8 newClient.Connect(remoteEP);
9 }
10 catch (SocketException)
11 {
12 return "SocketException";
13 }
14 NetworkStream nwstream = newClient.GetStream();
15 StreamWriter smwriter = new StreamWriter(nwstream, Encoding.ASCII);
16 StreamReader smreader = new StreamReader(nwstream, Encoding.ASCII);
17 smwriter.WriteLine("/input,"+commandFileName);
18 smwriter.Flush();
19 Thread thread = new Thread((ThreadStart)delegate
20 {
21 while (true)
22 {
23 if (nwstream.DataAvailable)
24 {
25 break;
26 }
27 Thread.Sleep(100);
28 }
29 resultFlag = smreader.ReadLine();
30 nwstream.Close();
31 smreader.Close();
32 smwriter.Close();
33 newClient.Close();
34 });
35 thread.Name = "GetReturnFlag";
36 thread.Start();
37 thread.Join();
38 thread.Abort();
39 while (thread.ThreadState != System.Threading.ThreadState.Aborted)
40 {
41 Thread.Sleep(100);
42 }
43 return (resultFlag);
44}
准备一下APDL文件:
31#fileName:input.mac
2a=3
3b=4
运行以下代码:
31string commandFileName = "input.mac";
2string resultFlag = sendCommand(commandFileName);
3Console.WriteLine(resultFlag);
得到:
ANSYS输出窗口内容为: